using Microsoft.AspNetCore.Mvc;
using MediatR;
using Microsoft.Extensions.Logging;
using RBAC.ErrorCode;
using RBAC.Write.Api.Application.Command.QualityCommand;

namespace RBAC.Write.Api.Controllers.QualityManage
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    /// <summary>
    /// 质量工单 写端控制器。
    /// </summary>
    /// <remarks>
    /// - 负责质量工单及其附件的新增、更新、删除（软删除）。
    /// - 实际业务由 MediatR 分发至相应处理器执行。
    /// </remarks>
    public class QualityOrderController : ControllerBase
    {
        private readonly IMediator _mediator;
        private readonly ILogger<QualityOrderController> _logger;

        public QualityOrderController(IMediator mediator, ILogger<QualityOrderController> logger)
        {
            _mediator = mediator;
            _logger = logger;
        }

        /// <summary>
        /// 新增质量工单。
        /// </summary>
        /// <remarks>
        /// 请求体：<see cref="QualityOrderAddCommand"/>。
        /// 成功：返回 <see cref="APIResult{T}"/> 的新建记录 Id；失败：返回错误信息与 0。
        /// 示例：POST api/QualityOrder/Add
        /// </remarks>
        [HttpPost]
        public Task<APIResult<int>> Add([FromBody] QualityOrderAddCommand request, CancellationToken cancellationToken)
        {
            // 通过 MediatR 分发至新增处理器
            return _mediator.Send(request, cancellationToken);
        }

        /// <summary>
        /// 更新质量工单。
        /// </summary>
        /// <remarks>
        /// 请求体：<see cref="QualityOrderUpdateCommand"/>（按提供的非空字段增量更新）。
        /// 成功：返回受影响行数；失败：返回 0 与错误信息。
        /// 示例：PUT api/QualityOrder/Update
        /// </remarks>
        [HttpPut]
        public Task<APIResult<int>> Update([FromBody] QualityOrderUpdateCommand request, CancellationToken cancellationToken)
        {
            // 通过 MediatR 分发至更新处理器
            return _mediator.Send(request, cancellationToken);
        }

        /// <summary>
        /// 删除质量工单（软删除）。
        /// </summary>
        /// <remarks>
        /// 路由参数：工单 Id。
        /// 成功：返回受影响行数；失败：返回 0 与错误信息。
        /// 示例：DELETE api/QualityOrder/Delete/123
        /// </remarks>
        [HttpDelete("{id:long}")]
        public Task<APIResult<int>> Delete([FromRoute] long id, CancellationToken cancellationToken)
        {
            // 组装删除命令并通过 MediatR 分发
            var request = new QualityOrderDeleteCommand { Id = id };
            return _mediator.Send(request, cancellationToken);
        }

        /// <summary>
        /// 新增质量工单附件。
        /// </summary>
        /// <remarks>
        /// 请求体：<see cref="QualityOrderAttachmentAddCommand"/>（需提供工单 Id 及文件信息）。
        /// 成功：返回新建附件 Id；失败：返回 0 与错误信息。
        /// 示例：POST api/QualityOrder/AddAttachment
        /// </remarks>
        [HttpPost]
        public Task<APIResult<int>> AddAttachment([FromBody] QualityOrderAttachmentAddCommand request, CancellationToken cancellationToken)
        {
            // 通过 MediatR 分发至附件新增处理器
            return _mediator.Send(request, cancellationToken);
        }

        /// <summary>
        /// 删除质量工单附件（软删除）。
        /// </summary>
        /// <remarks>
        /// 路由参数：附件 Id。
        /// 成功：返回受影响行数；失败：返回 0 与错误信息。
        /// 示例：DELETE api/QualityOrder/DeleteAttachment/10001
        /// </remarks>
        [HttpDelete("{id:long}")]
        public Task<APIResult<int>> DeleteAttachment([FromRoute] long id, CancellationToken cancellationToken)
        {
            // 组装附件删除命令并通过 MediatR 分发
            var request = new QualityOrderAttachmentDeleteCommand { Id = id };
            return _mediator.Send(request, cancellationToken);
        }
    }
}
